package com.sse.conexion;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.sse.VO.CasaVO;
import com.sse.VO.PermisoVO;
import com.sse.VO.UsuarioVO;
import com.sse.util.hashing.HashUtil;


/**
 * Clase encargada de manejar toda la persistencia correspondiente al usuario 
 * 
 * @author Andres
 *
 */
public class ManejadorUsuario {

	/**
	 * Metodo encargado de crear un usario en el sistema 
	 * 
	 * @param vo Valo requeridos para crear el usuario
	 * 
	 * @return cantidad de registros afectados en la base de datos
	 * @throws Exception 
	 */
	public static int crearUsuario(UsuarioVO vo) throws Exception
	{
		String strSql = "INSERT INTO usuario(" +
						"  nombre" +
						", pwd" +
						", usr" +
						", identificacion" +
						", telefono" +
						", rol_id)" +
						" VALUES ( ?, ?, ?, ?, ?, ?)";

		Connection con 			= ConectorBD.getConexion();
		PreparedStatement pstmt	= con.prepareStatement(strSql);   

		pstmt.setString(1,vo.getNombre());
		pstmt.setString(2,new HashUtil().MD5(vo.getContrasena()));
		pstmt.setString(3,vo.getUsuario());
		pstmt.setString(4,vo.getIdenticacion());
		pstmt.setString(5,vo.getTelefono());
		pstmt.setInt(6,vo.getRolId());
     
		int resultado = pstmt.executeUpdate();
		
		con.close();
		
		return resultado;
	}
	
	/**
	 * Metodo encargado de consultar un usuario
	 * 
	 * @param usuarioId: identificador del sistema
	 * 
	 * @return UsuarioVO: usuario identificado en la base de datos
	 * @throws Exception 
	 */
	public static UsuarioVO consultarUsuario(String usr, String pwd) throws Exception
	{
		UsuarioVO vo = null;
		
		String strSql = " SELECT " +
						"  nombre" +
						", pwd" +
						", usr" +
						", identificacion" +
						", telefono" +
						", rol_id" +
						", usuario_id " +
						"FROM usuario " +
						"WHERE usr = '" + usr + "'" +
						"AND   pwd = '" + new HashUtil().MD5(pwd)+ "'" ;
		
		Connection con 			= ConectorBD.getConexion();
		Statement sqlStatement 	= con.createStatement();
		ResultSet rs  			= null;

		rs 	= sqlStatement.executeQuery(strSql);
		
		if(rs.next())
		{	
			vo = new UsuarioVO();
			
			vo.setUsuarioId(rs.getInt("usuario_id"));
			vo.setRolId(rs.getInt("rol_id"));
			vo.setUsuario(rs.getString("usr"));
			vo.setContrasena(rs.getString("pwd"));
			vo.setNombre(rs.getString("nombre"));
			vo.setIdenticacion(rs.getString("identificacion"));
			vo.setTelefono(rs.getString("telefono"));
			
			vo.setPermisos(ManejadorUsuario.consultarPermisos(vo.getUsuarioId()));
		}	 
	
		rs.close();
		sqlStatement.close();
		con.close();
		
		return vo;
	}
	
	/**
	 * Metodo encargado de consultar todos los usuarios existentes en 
	 * el sistema 
	 * 
	 * @return lista con los usuarios del sistema 
	 * @throws SQLException 
	 */
	public ArrayList<UsuarioVO> consultarUsuario() throws SQLException, Exception
	{
		
		String strSql = " SELECT " +
						"  nombre" +
						", pwd" +
						", usr" +
						", identificacion" +
						", telefono" +
						", rol_id" +
						", usuario_id " +
						"FROM usuario " ;
		
		Connection con 			= ConectorBD.getConexion();
		Statement sqlStatement 	= con.createStatement();
		ResultSet rs  			= null;

		rs 	= sqlStatement.executeQuery(strSql);
		
		ArrayList<UsuarioVO> listaVO = new ArrayList<UsuarioVO>(); 
		
		while(rs.next())
		{	
			UsuarioVO vo = new UsuarioVO();
			
			vo.setUsuarioId(rs.getInt("usuario_id"));
			vo.setRolId(rs.getInt("rol_id"));
			vo.setUsuario(rs.getString("usr"));
			vo.setContrasena(rs.getString("pwd"));
			vo.setNombre(rs.getString("nombre"));
			vo.setIdenticacion(rs.getString("identificacion"));
			vo.setTelefono(rs.getString("telefono"));
			
			listaVO.add(vo);
		}	 
	
		rs.close();
		sqlStatement.close();
		con.close();
		
		return listaVO;
	}
	
	/**
	 * Metodo encargado de consultar un usuario especifico
	 * 
	 * @param usuarioId: identificador del sistema
	 * 
	 * @return UsuarioVO: usuario identificado en la base de datos
	 */
	public UsuarioVO consultarUsuario(int usuarioId)
	{
		return null;
	}
	
	/**
	 * Metodo encargado de consultar los inmuebles de un usuario
	 * 
	 * @param usuarioId: Identificador del usuario
	 * 
	 * @return los inmuebles de un usuario
	 */
	public ArrayList<CasaVO> consultarInmuebles(int usuarioId)
	{
		return null;
	}
	
	
	/**
	 * Metodo encargado de obtener los permisos de un usuario especifico 
	 * 
	 * @return la lista de permisos de un usuario
	 * @throws Exception 
	 */
	public static ArrayList<PermisoVO> consultarPermisos(int usuarioId) throws Exception
	{

		String strSql = "SELECT pe.rol_id, pe.operacion_id, ro.nombre AS nomRol, op.nombre as nomOperacion " +
						"FROM usuario us " +
						" JOIN rol ro ON (us.rol_id = ro.rol_id) " +
						" JOIN permisos pe ON (ro.rol_id = pe.rol_id) " +
						" JOIN operacion op ON (pe.operacion_id = op.opereacion_id) " +
						"WHERE us.usuario_id ="+usuarioId;
		
		Connection con 			= ConectorBD.getConexion();
		Statement sqlStatement 	= con.createStatement();
		ResultSet rs  			= null;

		rs 	= sqlStatement.executeQuery(strSql);
		
		ArrayList<PermisoVO> listaVO = new ArrayList<PermisoVO>();
		
		while(rs.next())
		{	
			PermisoVO vo = new PermisoVO();
			
			vo.setIdentificador(rs.getInt("operacion_id"));
			vo.setNombre(rs.getString("nomOperacion"));
			
			listaVO.add(vo);
		}	 
	
		rs.close();
		sqlStatement.close();
		con.close();
		
		return listaVO;

	}
	
	public static void main(String[] args) throws Exception {

		/*
		UsuarioVO vo = new UsuarioVO();
		
		vo.setNombre("Carlos Andres");
		vo.setRolId(1);
		vo.setTelefono("2452418");
		vo.setIdenticacion("80041604");
		vo.setUsuario("car1985");
		vo.setContrasena("123456");
		
		ManejadorUsuario.crearUsuario(vo);
		*/
		
		UsuarioVO vo = ManejadorUsuario.consultarUsuario("car1985", "123456");
		
		System.out.println(vo.getNombre());
		
		System.out.println(vo.getPermisos().size());
		
	} 
	
	
}
